package com.example.obs.service.FlileService;

import com.example.obs.dao.FileMapper;
import com.example.obs.model.domin.ObsFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 *
 * 对数据库的文件进行操作
 *
 */
@Transactional
@Service
public class FileServiceImpl implements FileService{
    @Autowired
    private FileMapper fileMapper;

    //---------------------private--------------
    /**
    * description:判断是不是文件夹
    * @param type 类型
    * @return 是则返回true
    */
    private boolean isDir(String type){
        return "文件夹".equals(type);
    }

    /**
    * description:统计从index开始的 '/' 字符数量
    * @param str 被统计字符串
    * @param index 开始位置
    * @return '/' 的数量
    */
    private int count(String str,int index){
        int count=0;
        for(int i=index;i<str.length();i++){
            if (str.charAt(i)=='/'){
                ++count;
            }
        }
        return count;
    }


    //---------------------public---------------

    /**
    * description:根据路径获取下面的文件列表
    * @param file 文件对象 里包含userId，文件夹路径
    * @return 该文件夹下的所有文件（不包括子文件夹里的文件）
    */
    @Override
    public List<ObsFile> selectFileListByPath(ObsFile file){
        if (file.getPath().isEmpty()||file.getPath().endsWith("/")) {
            List<ObsFile> list = fileMapper.selectFileListByPath(file.getUserId(), file.getPath(),file.getFileState(),file.getType());
            for(int i=0;i<list.size();i++){
                int count=count(list.get(i).getPath(), file.getPath().length());
                //把path移除掉deleteFile
                if(list.get(i).getPath().endsWith("/")&&count==0){
                    list.remove(list.get(i));
                    i--;
                }else{
                    //子文件夹下面的也移除掉
                    if (count!=0){
                        list.remove(list.get(i));
                        i--;
                    }
                }
          }
            return list;
        }
        else return null;
    }
    @Override
    public List<ObsFile> selectFileUnderFolderList(ObsFile file){
        List<ObsFile> list =fileMapper.selectFileListByPath(file.getUserId(),file.getPath()+"/",file.getFileState(),null);
        return list;
    }
    /**
    * description:根据类型获取文件列表
     * @param file 文件对象 包含用户id和文件类型
     * @return 该类型的所有文件
    */
    @Override
    public List<ObsFile> selectFileListByType(ObsFile file){
        return fileMapper.selectFileListByType(file.getUserId(), file.getType());
    }

    /**
    * description:根据提供的字全局搜索文件
    * @param file 文件信息，filename里面存放关键字
    * @return 搜索到的结果列表
    */
    @Override
    public List<ObsFile> selectFileListByNameAndPath(ObsFile file){
        return fileMapper.selectFileListByNameAndPath(file.getUserId(), file.getFileName(),file.getPath());
    }
    @Override
    public String getType(String name){
        if (name.endsWith(".jpg")||name.endsWith(".png")||name.endsWith(".gif")){
            return "图片";
        }else if (name.endsWith(".mp3")||name.endsWith(".ape")||name.endsWith(".wav")||name.endsWith(".flac")||name.endsWith(".m4a")){
            return "音乐";
        }else if(name.endsWith(".doc")||name.endsWith(".docx")){
            return "Word";
        }else if(name.endsWith(".xls")||name.endsWith(".xlsx")) {
            return "Excel";
        }else if(name.endsWith(".ppt")||name.endsWith(".pptx")){
            return "Ppt";
        }else if(name.endsWith(".pdf")){
            return "Pdf";
        } else if (name.endsWith(".mp4")||name.endsWith(".avi")||name.endsWith(".rmvb")||name.endsWith(".mkv")){
            return "视频";
        }
        return "其他";
    }
    @Override
    public List<ObsFile> selectFileListByState(ObsFile obsFile){
        return fileMapper.selectFileListByState(obsFile.getUserId(),obsFile.getFileState());
    }

    /**
    * description:向数据库添加文件信息  同名则覆盖
    * @param file 文件信息
    */
    @Override
    public void addFile(ObsFile file){
        ObsFile dstFile=fileMapper.getFileByPath(file.getUserId(), file.getPath());
        //存在同名文件需要删掉
        if(dstFile!=null){
            fileMapper.deleteFile(dstFile.getFileId());
        }
        System.out.println("开始添加");
        fileMapper.addFile(file);
    }

    /**
    * description:复制文件 同名则覆盖
    * @param file 文件信息，原路径放在name、新路径放在path
    */
    @Override
    public void copyFile(ObsFile file){
        ObsFile srcFile=fileMapper.getFileByFileId(file.getFileId());
        srcFile.setPath(file.getPath());
        srcFile.setMakeTime(new Date());
        ObsFile dstFile=fileMapper.getFileByPath(file.getUserId(), file.getPath());
        //新路径存在同名文件就需要删掉他
        if(dstFile!=null){
            fileMapper.deleteFile(dstFile.getFileId());
        }
        fileMapper.addFile(srcFile);
    }

    /**
    * description:从数据库删除文件/文件夹
    * @param file 被删除的文件 包括文件id，用户id和path
    */
    @Override
    public void deleteFile(ObsFile file){
        if (isDir(file.getPath())||"文件夹".equals(file.getType())){
            //文件夹根据所属用户和文件夹路径 将路径下的东西全删了
            fileMapper.deleteDir(file.getUserId(), file.getPath());
        }else {
            //文件直接根据文件id删除
            System.out.println("文件的ID："+file.getFileId());
            fileMapper.deleteFile(file.getFileId());
        }
    }

    /**
    * description:更改文件命
    * @param file 文件信息，原路径放在name、新路径放在path
    */
    @Override
    public void updateFileName(ObsFile file){
        int index=file.getPath().lastIndexOf('/');
        String name=file.getPath().substring(index+1);
        fileMapper.updateFileName(file.getFileId(),file.getPath(),name);
    }

    /**
    * description:更改文件路径，即移动文件 同名则覆盖
    * @param file 文件信息，新路径放在path
    */
    @Override
    public void updateFilePath(ObsFile file){
        ObsFile dstFile=fileMapper.getFileByPath(file.getUserId(), file.getPath());
        //新路径存在同名文件就需要删掉他
        if(dstFile!=null){
            fileMapper.deleteFile(dstFile.getFileId());
        }
        fileMapper.updateFilePath(file.getFileId(), file.getPath());
    }

    /**
     * description:更改文件状态
     * @param obsFile
     */
    @Override
    public void updateFileState(ObsFile obsFile){

        fileMapper.updateFileState(obsFile.getFileId(),obsFile.getFileState());

    }

    @Override
    public boolean Exist(Integer id,String path){
        ObsFile file = fileMapper.getFileByPath(id,path);
        if (file == null ){
            return true;
        }
        else {
            return false;
        }
    }

    @Override
    public List<ObsFile> selectDocumentList(ObsFile obsFile){
        String[] types = new String[]{"Word","Excel","Ppt","Txt","Pdf"};
        List<ObsFile> list= fileMapper.DocumentsList(obsFile.getUserId(),types);
        return  list;
    }

    @Override
    public ObsFile selectFileByFileId(Integer fileId){
        return fileMapper.getFileByFileId(fileId);
    }
}
